"use strict";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
const { exec, execSync } = require("child_process");
const clipboard = require("electron").clipboard;
const { dialog } = require("electron");
const path = require("path");
import axios from "axios";
import { app, protocol, BrowserWindow, ipcMain, Menu } from "electron";
import installExtension, { VUEJS3_DEVTOOLS } from "electron-devtools-installer";
const isDevelopment = process.env.NODE_ENV !== "production";

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
    { scheme: "app", privileges: { secure: true, standard: true } },
]);

async function createWindow() {
    // Create the browser window.
    const win = new BrowserWindow({
        width: 1050,
        height: 600,
        webPreferences: {
            contextIsolation: false,
            nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
            contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
            preload: __static + "/preload.js",
        },
    });

    const isMac = process.platform === "darwin";

    const template = [
        {
            label: "View",
            submenu: [
                { role: "reload", label: "刷新" },
                { role: "forceReload", label: "强制刷新" },
                { role: "toggleDevTools", label: "开发者工具" },
                { type: "separator" },
                { role: "resetZoom", label: "重置缩放" },
                { role: "zoomIn", label: "放大" },
                { role: "zoomOut", label: "缩小" },
                { type: "separator" },
                { role: "togglefullscreen", label: "全屏" },
            ],
        },
        // { role: 'windowMenu' }
        {
            label: "Window",
            submenu: [
                { role: "minimize", label: "最小化" },
                ...(isMac
                    ? [
                          { type: "separator" },
                          { role: "front", label: "前置" },
                          { type: "separator" },
                          { role: "window" },
                      ]
                    : [{ role: "close" }]),
            ],
        },
    ];
    const menu = Menu.buildFromTemplate(template);
    Menu.setApplicationMenu(menu);
    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // Load the url of the dev server if in development mode
        await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
        if (!process.env.IS_TEST) win.webContents.openDevTools();
    } else {
        createProtocol("app");
        // Load the index.html when not in development
        win.loadURL("app://./index.html");
    }
}
const runServer = (workPath) => {
    const pyPath = path.join(__static, "httprunnerServer.py");
    exec(`python ${pyPath} -p ${workPath}`, (error, stdout, stderr) => {
        if (error) {
            console.log(`error: ${error.message}`);
            exec(
                `python3 ${pyPath} -p ${workPath}`,
                (error, stdout, stderr) => {
                    if (error) {
                        console.log(`error: ${error.message}`);
                        return;
                    }
                }
            );
            return;
        }
    });
};

ipcMain.on("appToMain", (e, args) => {
    let cmd = args["cmd"];
    if (cmd === "run") {
        let workPath = args["workPath"];
        runServer(workPath);
        e.sender.send("mainToApp", { cmd: cmd, msg: "ok" });
    }
    if (cmd === "copy") {
        let text = args["text"];
        clipboard.writeText(text);
        e.sender.send("mainToApp", { cmd: cmd, msg: "ok" });
    }
});
// Quit when all windows are closed.
app.on("window-all-closed", () => {
    quitServer()
        .then((res) => {
            console.log(res);
        })
        .catch((err) => {
            console.log("退出");
        })
        .finally(() => {
            if (process.platform !== "darwin") {
                app.quit();
            }
        });
});

app.on("activate", () => {
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

function quitServer() {
    return axios.get("http://127.0.0.1:5000/quit");
}
app.on("ready", async () => {
    if (isDevelopment && !process.env.IS_TEST) {
        // Install Vue Devtools
        // try {
        //   await installExtension(VUEJS3_DEVTOOLS)
        // } catch (e) {
        //   console.error('Vue Devtools failed to install:', e.toString())
        // }
    }
    createWindow();
    const pipPath = path.join(__static, "requirements.txt");

    try {
        exec(`pip install -r ${pipPath}`);
    } catch (error) {
        console.log(error);
    }
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
    if (process.platform === "win32") {
        process.on("message", (data) => {
            if (data === "graceful-exit") {
                quitServer()
                    .then((res) => {
                        console.log(res);
                    })
                    .catch((err) => {
                        console.log("退出");
                    })
                    .finally(() => {
                        if (process.platform !== "darwin") {
                            app.quit();
                        }
                    });
            }
        });
    } else {
        quitServer();
        process.on("SIGTERM", () => {
            app.quit();
        });
    }
}
